import Vue from "vue";
import VueRouter from "vue-router";
import routes from "./routes";
import store from "@/store";
Vue.use(VueRouter);
//1. 保存旧的push方法
const oldPushMethod = VueRouter.prototype.push;
//2. 覆盖原来的push方法 重写push
VueRouter.prototype.push = function (
  location,
  onComplate = () => {},
  onAbort = () => {}
) {
  //内部使用的还是以前的push方法,但是我们给添加了处理异常的回调函数
  return oldPushMethod.call(this, location, onComplate, onAbort);
};

//1. 保存旧的replace方法
const oldReplaceMethod = VueRouter.prototype.replace;
//2. 覆盖原来的replace方法 重写replace
VueRouter.prototype.replace = function (
  location,
  onComplate = () => {},
  onAbort = () => {}
) {
  //内部使用的还是以前的push方法,但是我们给添加了处理异常的回调函数
  return oldReplaceMethod.call(this, location, onComplate, onAbort);
};

const router = new VueRouter({
  routes,
  mode: "history",
});
const whitePath = ["login", "home","register","search","detail","addCartSuccess","ShopCart"];

router.beforeEach(async (to, from, next) => {
  //token校验(路由权限控制)
  const token = store.state.user.token;
  // console.log(store);
  //判断token是否存在
  if (token) {
    //如果token存在
    //判断我去的地方是不是登录页,如果是则直接去home即可
    if (to.name === "login") {
      next("/home");
    } else {
      //判断使用有用户信息
      const isUserInfo = !!store.state.user.userInfo.nickName;
      if (isUserInfo) {
        //如果用户信息存在 则直接放行
        next();
      } else {
        try {
          // //如果用户信息不存在,则获取用户的信息
          await store.dispatch("user/getUserInfo");
          //如果用户信息请求成功则直接放行
          next();
        } catch (e) {
          //如果请求用户信息失败，则直接去重新登录
          store.dispatch("user/getResetUser"); //重置user
          next(`/login?redirect=${to.name}`);
        }
      }
    }
  } else {
    //如果token不存在
    //判断当前去的地方是白名单
    if (whitePath.includes(to.name)) {
      //如果去的地方不需要登录则直接放行
      next();
    } else {
      //否则再次登录
      next(`/login?redirect=${to.name}`);
    }
  }
});

export default router;
